package com.fs.controller.admin;

import com.fs.dto.ProductAddDTO;
import com.fs.entity.Product;
import com.fs.result.Result;
import com.fs.service.ProductService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 商品管理控制层
 * 功能：负责接收前端请求并调用Service层处理商品的增删改查逻辑。
 * 模块路径：/admin/product
 */
@RestController("amdinProductController")
@RequestMapping("/admin/product")
@Api(tags = "商品管理接口")
@Slf4j
public class ProductController {

    @Autowired
    private ProductService productService;

    /**
     * 添加商品
     * 前端传入：ProductAddDTO
     * 后端自动设置创建时间和更新时间
     */
    @PostMapping("/add")
    @ApiOperation("添加商品")
    public Result<String> addProduct(@RequestBody ProductAddDTO productAddDTO) {
        log.info("添加商品：{}", productAddDTO);
        productService.addProduct(productAddDTO);
        return Result.success("商品添加成功");
    }

    /**
     * 根据商品ID查询商品详情
     * 用于编辑前的数据回显
     */
    @GetMapping("/{id}")
    @ApiOperation("根据ID查询商品信息")
    public Result<Product> getById(@PathVariable Long id) {
        log.info("查询商品详情，ID={}", id);
        Product product = productService.getById(id);
        return Result.success(product);
    }

    /**
     * 更新商品信息
     * 前端先通过 getById 查询展示数据，再提交更新
     */
    @PutMapping("/update")
    @ApiOperation("更新商品信息")
    public Result<String> update(@RequestBody Product product) {
        log.info("更新商品信息：{}", product);
        productService.updateProduct(product);
        return Result.success("商品更新成功");
    }

    /**
     * 批量删除商品
     * 删除顺序：标签表 → 图片表 → 商品表
     */
    @DeleteMapping("/delete/{ids}")
    @ApiOperation("批量删除商品")
    public Result<String> delete(@PathVariable("ids") String ids) {
        log.info("请求 - 批量删除商品，原始 ids={}", ids);
        if (ids == null || ids.trim().isEmpty()) {
            return Result.error("请提供要删除的商品ID列表");
        }
        List<Long> idList = Arrays.stream(ids.split(","))
                .map(String::trim)
                .filter(s -> !s.isEmpty())
                .map(Long::valueOf)
                .collect(Collectors.toList());
        productService.deleteBatch(idList);
        return Result.success("删除成功");
    }

    /**
     * 修改商品状态（启售/停售）
     * 示例：PUT /admin/product/status/15/0
     */
    @PutMapping("/status/{id}/{status}")
    @ApiOperation("修改商品状态：1=上架，0=下架")
    public Result<String> changeStatus(@PathVariable Long id, @PathVariable Integer status) {
        log.info("请求 - 修改商品状态 id={} status={}", id, status);
        productService.changeStatus(id, status);
        return Result.success("商品状态更新成功");
    }


    /**
     * 分类查询（无分页）
     * 支持参数：name（模糊）、type（模糊）、tag（模糊）、status（可选，默认1）、sortField、sortOrder
     *
     * sortField / sortOrder 可为空，默认按 create_time DESC 排序
     *
     * 安全说明：sortField 会直接拼接到 ORDER BY 中，务必在 Service/Mapper 层校验白名单，避免 SQL 注入。
     */
    @GetMapping("/query")
    @ApiOperation("条件查询商品（支持按 name/type/tag/status 筛选，支持排序）")
    public Result<List<?>> query(
            @RequestParam(value = "name", required = false) String name,
            @RequestParam(value = "type", required = false) String type,
            @RequestParam(value = "tag", required = false) String tag,
            @RequestParam(value = "status", required = false) Integer status,
            @RequestParam(value = "sortField", required = false) String sortField,
            @RequestParam(value = "sortOrder", required = false) String sortOrder
    ) {
        log.info("请求 - 条件查询商品 name={} type={} tag={} status={} sortField={} sortOrder={}",
                name, type, tag, status, sortField, sortOrder);
        List<?> list = productService.queryByCondition(name, type, tag, status, sortField, sortOrder);
        return Result.success(list);
    }



}
